﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class ObjektSpielMenue
    Inherits ObjektFormMenue



    Enum Spielmodi
        Nichts
        Einheitausgewaehlt
        Gebaeudeausgewaehlt
        AuswahlmenueEinheit
        FeuerradiusAnzeigen
        Angriff
        Entladen
        SiloAbfeuern
        GebaeudeSchuss
        Reparieren
        Abzug
        Explosion
        TagZuTagAnzeige
        Minimap
        Tor1Bauen
        Tor2Bauen
        Tor3Bauen
        OmegaRaketeZuenden
        GebaeudeBauen
        KOInfoAnzeige
        ''' <summary>
        ''' Momentan sprechen irgendwelche KO's irgendetwas?
        ''' </summary>
        ''' <remarks></remarks>
        KOSprechen
        ''' <summary>
        ''' Man kann Einheiten in Flugzeugtraegern bauen.
        ''' </summary>
        ''' <remarks></remarks>
        FlugzeugTraegerBauen
        ''' <summary>
        ''' So wir wollen also etwas aufdecken.
        ''' </summary>
        ''' <remarks></remarks>
        Leuchtrakete
        ''' <summary>
        ''' Wir wollen eine Bruecke bauen
        ''' </summary>
        ''' <remarks></remarks>
        BrueckeBauen
        ''' <summary>
        ''' Wir wollen eine Mauer bauen
        ''' </summary>
        ''' <remarks></remarks>
        MauerBauen
        ''' <summary>
        ''' Wir wollen Anzeigen in welchem Bereich eine Einheit einen Boost erhaelt!
        ''' </summary>
        ''' <remarks></remarks>
        RangReichweiteAnzeigen
    End Enum
    Public Spielmodus As Spielmodi = Spielmodi.Nichts
    Public ZuentladendeEinheit As Integer
    Public RecordInfoAnzeige As RekordSpielInfoAnzeige
    Dim Chat As ObjektChat
    Dim OldSize As Size = Hauptmenue.MainMenue.Size
    Public Sub New(ByVal Spielstand As Boolean, Optional ByVal Startspieler As Integer = 1)
        MyBase.New(New ObjektButton() {}, Nothing, New ObjektNumericUpDown() {}, Nothing, New ObjektValueSchieber() {}, New ObjektMultiValue() {}, New ObjektCheckBox() {})
        If DataSettings.Verhaeltnis = Hauptmenue.Breitbild Then
            Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\SpielHintergundGross.png")
        Else
            Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\SpielHintergund.png")
        End If
        'Delete Autosave for backward Steps.
        For Each File In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad + "Savegames\", FileIO.SearchOption.SearchTopLevelOnly, "*.sav")
            If File.ToLower.StartsWith("autospeichern") Then
                My.Computer.FileSystem.DeleteFile(File)
            End If
        Next
        Objektverwalter.CurrentAutosaveGameNumber = 0
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Game started.")
        End If
        If Startspieler <= 0 Then Startspieler = 1 'Just to avoid bugs. Should never happen
        'Wir initialisieren das Spiel
        If Spielstand = False Then
            Objektverwalter.Spielfeld.Runde = 0
            Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(Startspieler)
            Objektverwalter.Spielfeld.SpielStart()
        Else
            'Tja jetzt muessen die KO's geladen werden()
            For Each Spieler In Objektverwalter.Spielfeld.Spieler
                For Each KO In Spieler.KOS
                    If Not KO Is Nothing Then
                        KO.KONachSpielstandladenLaden()
                    End If
                Next
            Next
        End If
        'Spielen wir eine Aufzeichnung ab?
        If Hauptmenue.AufzeichnungAbspielen Then
            'Anzeigenhilfe laden.
            RecordInfoAnzeige = New RekordSpielInfoAnzeige
        End If
        If Not Spielstand Then
            Objektverwalter.VomRandEntfernen(True)
        End If
        Objektverwalter.Spielfeld.Sichterstellen()
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Normal
        AutoResizeWindow()
        Hauptmenue.Rechteck.Width = DataSettings.BildschirmBreite
        Hauptmenue.Rechteck.Height = DataSettings.BildschirmHoehe
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
                Hauptmenue.Chatroom = New Chat(False, Commander_Wars.Chat.Modus.Game, )
            End If
        End If
    End Sub
    Public Overrides Sub Frame()
        If Not Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then

        End If
        Hauptmenue.SpielfeldScrollen()
    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)


        If Hauptmenue.Chatroom IsNot Nothing Then 'Chatten wir?
            If Hauptmenue.Chatroom.Keydown(sender, e) Then
                Exit Sub
            End If
        End If
        'wir duerfen nur etwas tun wenn keine Animationen existieren
        If Objektverwalter.Spielfeld.Animationen IsNot Nothing Then
            If Objektverwalter.Spielfeld.Animationen.Length > 0 Then
                For Each Ani In Objektverwalter.Spielfeld.Animationen
                    Ani.KeyDown(sender, e)
                Next
                Exit Sub
            End If
        End If
        If BackbufferSpiel.GetBufferLength > 0 Then Exit Sub
        If Objektverwalter.Spielfeld.EingabenErlauben = True Then
            If Spielmodus = Spielmodi.KOInfoAnzeige Then
                Objektverwalter.Spielfeld.KOInfos.KeyDown(sender, e)
            Else
                Select Case Spielmodus
                    Case Spielmodi.KOSprechen
                        If ObjektKODialog.KOTextZeilen IsNot Nothing Then
                            ObjektKODialog.KOTextZeilen.KeyDown(sender, e)
                        End If
                    Case Else
                        Select Case e.KeyCode
                            Case Keys.Escape
                                Dispose()
                            Case DataSettings.Oben
                                CursorVerschieben(0, -1)
                            Case DataSettings.Unten
                                CursorVerschieben(0, 1)
                            Case DataSettings.Rechts
                                CursorVerschieben(1, 0)
                            Case DataSettings.Links
                                CursorVerschieben(-1, 0)
                            Case DataSettings.Bestaetigen
                                Dim Maus As New System.Windows.Forms.MouseEventArgs(Windows.Forms.MouseButtons.Left, 1, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, 0)
                                MouseDown(sender, Maus)
                            Case DataSettings.Abrechen
                                Dim Maus As New System.Windows.Forms.MouseEventArgs(Windows.Forms.MouseButtons.Right, 1, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, 0)
                                MouseDown(sender, Maus)
                                MouseMove(sender, Maus)
                            Case DataSettings.NaechsteEinheit
                                Objektverwalter.Spielfeld.NaechsteEinheit()
                            Case DataSettings.SelectTaste
                                If Spielmodus = Spielmodi.Nichts Or Spielmodus = Spielmodi.Minimap Then
                                    If IsNothing(Objektverwalter.Minimap) = False Then
                                        Objektverwalter.Minimap.Reset()
                                        Objektverwalter.Minimap = Nothing
                                        Spielmodus = Spielmodi.Nichts
                                    Else
                                        Spielmodus = Spielmodi.Minimap
                                        Objektverwalter.Minimap = New ObjektMinimap(Objektverwalter.Spielfeld, Nothing)
                                    End If
                                End If
                                'Ich liebe schnellspeichern & Laden :)
                            Case DataSettings.Quicksave1 'Ich weiss allerdings nicht, wie das so in Netzwerkspielen ist... Koennte Probleme bereiten...
                                Hauptmenue.Speichern("Quicksave1", ".sav")
                            Case DataSettings.Quicksave2
                                Hauptmenue.Speichern("Quicksave2", ".sav")
                            Case DataSettings.Quickload1
                                Hauptmenue.Laden("Quicksave1", False, ".sav", , , True)
                            Case DataSettings.Quickload2
                                Hauptmenue.Laden("Quicksave2", False, ".sav", , , True)
                            Case Keys.Z
                                If e.Control Then
                                    'Rueckgaengig... so richtig mach ich's ja nicht. Allerdings speichern wir immer wieder und in sofern koennte es klappen indem wir wieder laden. (Es kann natuerlich auch sein, dass du damit alles kaput machst :(
                                    If e.Alt Then
                                        'Das Rueckgaengig scheint Missglueckt zu sein. Zum Glueck haben wir einen Sicherheitsstand gemacht.
                                        Hauptmenue.Laden("AutospeichernSicherheit", False, ".sav", , , True)
                                    Else
                                        Objektverwalter.AutospeichernLaden()
                                    End If
                                    Objektverwalter.Spielfeld.SpielWiederaufnehmen()
                                End If
                            Case DataSettings.Schlachtwechsel
                                Objektverwalter.Spielfeld.SchlachtWechseln()
                            Case DataSettings.Key_Scrollen
                                If My.Computer.Keyboard.CtrlKeyDown Then
                                    Hauptmenue.ScrollenKameraKippen = True
                                    Hauptmenue.ScrollenX = ObjektMaus.XKoordinate
                                    Hauptmenue.ScrollenY = ObjektMaus.YKoordinate
                                Else
                                    Hauptmenue.Scrollen = True
                                    Hauptmenue.ScrollenX = ObjektMaus.XKoordinate
                                    Hauptmenue.ScrollenY = ObjektMaus.YKoordinate
                                End If
                        End Select
                End Select
            End If
        Else

            If ObjektKODialog.KOTextZeilen IsNot Nothing Then
                ObjektKODialog.KOTextZeilen.KeyDown(sender, e)
            End If
            Select Case e.KeyCode
                Case Keys.Escape
                    Hauptmenue.Ini(Hauptmenue.Formmodi.SiegMenue)
            End Select
        End If

    End Sub




    Public Overrides Sub Malen()
        MyBase.ObjekteMalen()
        If Hauptmenue.Chatroom IsNot Nothing Then Hauptmenue.Chatroom.Malen()
        If RecordInfoAnzeige IsNot Nothing Then RecordInfoAnzeige.Malen()

    End Sub

    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        'wir duerfen nur etwas tun wenn keine Animationen existieren

        Select Case e.Button
            Case MouseButtons.Middle
                ButtonGeklicktMitte(e)
        End Select

        If Hauptmenue.Chatroom IsNot Nothing Then
            If Hauptmenue.Chatroom.MouseDown(sender, e) Then
                Exit Sub
            End If
        End If
        If Hauptmenue.AufzeichnungAbspielen Then RecordInfoAnzeige.MouseDown(e)

        If Objektverwalter.Spielfeld.Animationen.Length > 0 Then
            For Each Ani In Objektverwalter.Spielfeld.Animationen
                Ani.MouseDown(sender, e)
            Next
            Exit Sub
        End If
        If BackbufferSpiel.GetBufferLength > 0 Then Exit Sub

        If Objektverwalter.Spielfeld.EingabenErlauben = True Then
            If Spielmodus = Spielmodi.KOInfoAnzeige Then
                Objektverwalter.Spielfeld.KOInfos.MouseDown(sender, e)
            Else
                Dim X As Integer = Hauptmenue.SpielfeldPunkt.X
                Dim Y As Integer = Hauptmenue.SpielfeldPunkt.Y
                Dim Funktion As String = ""
                If e.Button = Windows.Forms.MouseButtons.Left Then
                    Funktion = checkMouseUPObjekte(e.X, e.Y)
                End If
                If Funktion = "" Then
                    Select Case e.Button
                        Case Windows.Forms.MouseButtons.Left
                            'Wir berechnen die Kordinaten in Feldern

                            If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                                Select Case Spielmodus
                                    Case Spielmodi.Nichts
                                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                            If Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).HatsichBewegt = False Then
                                                Objektverwalter.Einheitauswaehlen(X, Y)
                                            Else
                                                Objektverwalter.AuswahlMenuerschaffen()
                                            End If
                                        ElseIf IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                                            Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y)
                                        Else
                                            Objektverwalter.AuswahlMenuerschaffen()
                                        End If
                                    Case Spielmodi.Einheitausgewaehlt
                                        If Objektverwalter.Spielfeld.AktuelleEinheit.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler And Objektverwalter.Spielfeld.AktuelleEinheit.HatsichBewegt = False Then
                                            EinheitBewegungsBefehl(X, Y)
                                        Else

                                        End If
                                    Case Spielmodi.Angriff
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.MarkierteFelder.Clear()
                                            If IsNothing(Objektverwalter.Spielfeld.Laufen) Then
                                                Objektverwalter.Angriff(Objektverwalter.Spielfeld.AktuelleEinheit, X, Y)
                                            Else
                                                Objektverwalter.Angriff(Objektverwalter.Spielfeld.AktuelleEinheit, X, Y)
                                            End If
                                        End If
                                    Case Spielmodi.BrueckeBauen
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.MarkierteFelder.Clear()
                                            If IsNothing(Objektverwalter.Spielfeld.Laufen) Then
                                                Objektverwalter.MauerBrueckeBauen(X, Y)
                                            Else
                                                Objektverwalter.MauerBrueckeBauen(X, Y)
                                            End If
                                        End If
                                    Case Spielmodi.MauerBauen
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.MarkierteFelder.Clear()
                                            If IsNothing(Objektverwalter.Spielfeld.Laufen) Then
                                                Objektverwalter.MauerBrueckeBauen(X, Y)
                                            Else
                                                Objektverwalter.MauerBrueckeBauen(X, Y)
                                            End If
                                        End If
                                    Case Spielmodi.Leuchtrakete
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.LechtraketeAbfeuern(X, Y)
                                        End If
                                    Case Spielmodi.Entladen
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.MarkierteFelder.Clear()
                                            Objektverwalter.Entladen(X, Y, ZuentladendeEinheit)
                                        End If
                                    Case Spielmodi.SiloAbfeuern
                                        Objektverwalter.SiloZuenden(X, Y)
                                    Case Spielmodi.GebaeudeSchuss
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(X, Y)
                                            Objektverwalter.MarkierteFelder.Clear()
                                            Spielmodus = Spielmodi.Nichts
                                        End If
                                    Case Spielmodi.Reparieren
                                        If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = True Then
                                            Objektverwalter.Reparieren(X, Y)
                                        End If
                                    Case Spielmodi.Abzug
                                        Objektverwalter.EinheitAbziehen(X, Y, True)
                                    Case Spielmodi.Explosion
                                        Objektverwalter.Explosion()
                                    Case Spielmodi.TagZuTagAnzeige
                                        Spielmodus = Spielmodi.Abzug
                                        Objektverwalter.Spielfeld.RundenAnfangAnzeige.Frames = RundenAnfangBild.FrameMax
                                    Case Spielmodi.Minimap
                                        Objektverwalter.Minimap.Reset()
                                        Objektverwalter.Minimap = Nothing
                                        Spielmodus = Spielmodi.Nichts
                                    Case Spielmodi.OmegaRaketeZuenden
                                        Dim O As GebaeudeOmega_Rakete = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                                        O.RaketeStarten(X, Y)
                                        'In Arbeit
                                    Case Spielmodi.KOSprechen
                                        If ObjektKODialog.KOTextZeilen IsNot Nothing Then
                                            ObjektKODialog.KOTextZeilen.MouseDown(sender, e)
                                        End If
                                End Select
                            Else
                                Select Case Spielmodus
                                    Case Spielmodi.KOSprechen
                                        If ObjektKODialog.KOTextZeilen IsNot Nothing Then
                                            ObjektKODialog.KOTextZeilen.MouseDown(sender, e)
                                        End If
                                End Select
                            End If
                        Case Windows.Forms.MouseButtons.Right
                            DeleteAction(X, Y, False)
                    End Select
                Else
                    SPStringBefehl(Funktion)
                End If
            End If
        Else
            'Andere Objekte ueberpruefen...
            If Objektverwalter.Spielfeld.Angriff IsNot Nothing Then
                If Objektverwalter.Spielfeld.Angriff.Kampfani IsNot Nothing Then
                    Objektverwalter.Spielfeld.Angriff.Kampfani.MouseDown(sender, e)
                End If
            End If
            If ObjektKODialog.KOTextZeilen IsNot Nothing Then
                ObjektKODialog.KOTextZeilen.MouseDown(sender, e)
            End If

            'Einheit zum Ziel bewegen?
            Select Case e.Button
                Case Windows.Forms.MouseButtons.Left
                    Select Case Spielmodus
                        Case Spielmodi.Einheitausgewaehlt
                            If IsNothing(Objektverwalter.Spielfeld.Laufen) = False And Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                'Wir sind etwas in Eile die Einheit wird zum Ziel gesetzt
                                Objektverwalter.Spielfeld.Laufen.ZumZielSetzen()
                            End If
                    End Select
            End Select
        End If
    End Sub
    Public Sub DeleteAction(ByVal X As Integer, ByVal Y As Integer, ByVal OhneSound As Boolean)
        Select Case Spielmodus
            Case Spielmodi.Minimap
                Objektverwalter.Minimap.Reset()
                Objektverwalter.Minimap = Nothing
                Spielmodus = Spielmodi.Nichts
            Case Spielmodi.Einheitausgewaehlt
                Objektverwalter.Einheitabwaehlen(OhneSound)
            Case Spielmodi.FeuerradiusAnzeigen
                Objektverwalter.MarkierteFelder.Clear()
                If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars2 Then
                    If Objektverwalter.ShowRangZone(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                        Spielmodus = Spielmodi.RangReichweiteAnzeigen
                    Else
                        Spielmodus = Spielmodi.Nichts
                    End If
                Else
                    Spielmodus = Spielmodi.Nichts
                End If
            Case Spielmodi.RangReichweiteAnzeigen
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
            Case Spielmodi.AuswahlmenueEinheit
                Hauptmenue.CursorPlazieren(Objektverwalter.EinheitenMenue.Feldpunkt.X * Hauptmenue.Feldbreite, Objektverwalter.EinheitenMenue.Feldpunkt.Y * Hauptmenue.Feldbreite)
                Objektverwalter.EinheitenMenue.Dispose()
                Objektverwalter.EinheitenMenue = Nothing
                ObjektMaus.Visible = True
                Objektverwalter.Einheitabwaehlen(OhneSound)
            Case Spielmodi.Nichts
                If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                If Not Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Waffe1 = "Keine" Then
                                    FeuerradiusAnzeigen(X, Y)
                                ElseIf Not Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Waffe2 = "Keine" Then
                                    FeuerradiusAnzeigen(X, Y)
                                End If
                            End If
                        ElseIf IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                            Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.FeuerradiusAnzeigen()
                        End If
                    End If
                End If
            Case Spielmodi.Angriff
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Spielfeld.AngriffsAnzeige = Nothing
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.BrueckeBauen
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.MauerBauen
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.Leuchtrakete
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.Entladen
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.SiloAbfeuern
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.GebaeudeSchuss
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
            Case Spielmodi.Reparieren
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.Abzug
                Spielmodus = Spielmodi.Nichts
            Case Spielmodi.Explosion
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.OmegaRaketeZuenden
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
            Case Spielmodi.GebaeudeBauen
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.Tor1Bauen
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
            Case Spielmodi.Tor2Bauen
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
            Case Spielmodi.Tor3Bauen
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
            Case Spielmodi.FlugzeugTraegerBauen
                Objektverwalter.MarkierteFelder.Clear()
                Objektverwalter.Befehlsmenuerschaffen()
            Case Spielmodi.KOSprechen
                If ObjektKODialog.KOTextZeilen IsNot Nothing Then
                    Dim e As New System.Windows.Forms.MouseEventArgs(MouseButtons.Right, 1, X, Y, 0)
                    ObjektKODialog.KOTextZeilen.MouseDown(Nothing, e)
                End If
        End Select
    End Sub
    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If Hauptmenue.Chatroom IsNot Nothing Then Hauptmenue.Chatroom.MouseEnter(sender, e)
        If Hauptmenue.AufzeichnungAbspielen Then RecordInfoAnzeige.MouseMove(e)

        If Objektverwalter.Spielfeld.Animationen.Length > 0 Then Exit Sub
        Select Case Spielmodus
            Case Spielmodi.Einheitausgewaehlt
                If Objektverwalter.Spielfeld.OnMap(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                    If Objektverwalter.Spielfeld.EingabenErlauben = True Then
                        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                            If IsNothing(Objektverwalter.Spielfeld.AktuelleEinheitPfeil) = False Then
                                Objektverwalter.Spielfeld.AktuelleEinheitPfeil.PfeilAktualisieren(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y)
                            End If
                        End If
                    End If
                End If
            Case Spielmodi.Nichts
                MouseMoveObjekte(e.X, e.Y)
            Case Spielmodi.AuswahlmenueEinheit
                MouseMoveObjekte(e.X, e.Y)
            Case Spielmodi.Tor1Bauen
                MouseMoveObjekte(e.X, e.Y)
            Case Spielmodi.Tor2Bauen
                MouseMoveObjekte(e.X, e.Y)
            Case Spielmodi.Tor3Bauen
                MouseMoveObjekte(e.X, e.Y)
            Case Spielmodi.FlugzeugTraegerBauen
                MouseMoveObjekte(e.X, e.Y)
        End Select
    End Sub

    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If Hauptmenue.Chatroom IsNot Nothing Then Hauptmenue.Chatroom.MouseUp(sender, e)
        If Hauptmenue.AufzeichnungAbspielen Then RecordInfoAnzeige.MouseUp(e)
        If Objektverwalter.Spielfeld IsNot Nothing Then 'Game terminated
            Select Case e.Button
                Case MouseButtons.Middle
                    ButtonHochMitte()
            End Select
            If BackbufferSpiel.GetBufferLength > 0 Then Exit Sub
            If Objektverwalter.Spielfeld.Animationen.Length > 0 Then Exit Sub
            If Objektverwalter.Spielfeld.EingabenErlauben = False Then Exit Sub
            Select Case e.Button
                Case MouseButtons.Left
                    MouseUpLeft(e)
            End Select
        End If
    End Sub
    Public Sub MouseUpLeft(ByVal e As System.Windows.Forms.MouseEventArgs)
        If Objektverwalter.Spielfeld.Animationen.Length > 0 Then Exit Sub
        Select Case Spielmodus
            Case Spielmodi.FeuerradiusAnzeigen
                Objektverwalter.MarkierteFelder.Clear()
                Spielmodus = Spielmodi.Nichts
        End Select
    End Sub

    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If Hauptmenue.Chatroom IsNot Nothing Then Hauptmenue.Chatroom.MouseWheel(sender, e)
        If Spielmodus = Spielmodi.KOInfoAnzeige Then
            Objektverwalter.Spielfeld.KOInfos.MouseWheel(sender, e)
        Else
            If Not MouseWheelObjekte(sender, e) Then
                If My.Computer.Keyboard.ShiftKeyDown And (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
                    If Objektverwalter.Spielfeld IsNot Nothing Then
                        With Objektverwalter.Spielfeld
                            'Mit Steuerrung will man bestimmt zoomen!
                            If e.Delta > 0 Then
                                .KameraHoehe /= 1.1
                                'If .KameraHoehe < 5 Then .KameraHoehe = 5
                            Else
                                .KameraHoehe *= 1.1
                            End If
                            If .KameraHoehe > 420 Then .KameraHoehe = 420
                        End With

                    End If
                Else
                    If Objektverwalter.Spielfeld.Animationen.Length > 0 Then Exit Sub
                    Select Case Spielmodus
                        Case Spielmodi.Nichts
                            If e.Delta > 0 Then
                                Objektverwalter.Spielfeld.NaechsteEinheit()
                            Else
                                Objektverwalter.Spielfeld.LetzteEinheit()
                            End If
                    End Select
                End If
            End If
        End If
    End Sub

    Public Overrides Sub SetMausBild()
        If Hauptmenue.AufzeichnungAbspielen Then
            If ObjektMaus.YKoordinate < DataSettings.BildschirmHoehe - RekordSpielInfoAnzeige.Hoehe Then
                ObjektMaus.Zustand = ObjektMaus.Zustaende.Normal
            Else
                ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
            End If
        Else
            If Hauptmenue.Chatroom IsNot Nothing Then
                If Hauptmenue.Chatroom.Visible Then
                    If Hauptmenue.Chatroom.Top Then
                        If ObjektMaus.YKoordinate < Hauptmenue.Chatroom.Height + Commander_Wars.Chat.TopBorder Then
                            ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
                            Exit Sub
                        End If
                    Else
                        If ObjektMaus.YKoordinate > DataSettings.BildschirmHoehe - Hauptmenue.Chatroom.Height - Commander_Wars.Chat.TopBorder Then
                            ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
                            Exit Sub
                        End If
                    End If
                End If
            End If
            Select Case Spielmodus
                Case Spielmodi.Angriff
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.Angriff
                Case Spielmodi.SiloAbfeuern
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.SiloAnzeigeKlein
                Case Spielmodi.GebaeudeSchuss
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.Angriff
                Case Spielmodi.Abzug
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.Abzug
                Case Spielmodi.Explosion
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.SiloAnzeigeMittel
                Case Spielmodi.OmegaRaketeZuenden
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.SiloOmegaRakete
                Case Else
                    ObjektMaus.Zustand = ObjektMaus.Zustaende.Normal
            End Select
        End If
    End Sub

    Private Sub ButtonGeklicktMitte(ByVal E As System.Windows.Forms.MouseEventArgs)
        If E.Clicks >= 2 Then
            Objektverwalter.Zentrieren()
        Else
            If My.Computer.Keyboard.CtrlKeyDown Then
                Hauptmenue.ScrollenKameraKippen = True
                Hauptmenue.ScrollenX = E.X
                Hauptmenue.ScrollenY = E.Y
            Else
                Hauptmenue.Scrollen = True
                Hauptmenue.ScrollenX = E.X
                Hauptmenue.ScrollenY = E.Y
            End If
        End If

    End Sub
    Private Sub ButtonHochMitte()
        Hauptmenue.Scrollen = False
        Hauptmenue.ScrollenKameraKippen = False
    End Sub
    ''' <summary>
    ''' Fuehrt je nach Text Eingang einen Spielbefehl aus.
    ''' </summary>
    ''' <param name="Funktion"></param>
    ''' <remarks></remarks>
    Public Sub SPStringBefehl(ByVal Funktion As String)
        MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\OK.wav", False)

        'Wir haben auf einen Menuepunkt geklickt
        Dim Auswahlmenueloeschen As Boolean = True
        Select Case Funktion.ToLower
            Case KampfanimationsTypen.Alle.ToString.ToLower
                DataSettings.KampfAnimationen = KampfanimationsTypen.Alle
                DataSettings.MySettingsIniSave()
                Spielmodus = Spielmodi.Nichts
            Case KampfanimationsTypen.Eigene.ToString.ToLower
                DataSettings.KampfAnimationen = KampfanimationsTypen.Eigene
                DataSettings.MySettingsIniSave()
                Spielmodus = Spielmodi.Nichts
            Case KampfanimationsTypen.Feindliche.ToString.ToLower
                DataSettings.KampfAnimationen = KampfanimationsTypen.Feindliche
                DataSettings.MySettingsIniSave()
                Spielmodus = Spielmodi.Nichts
            Case KampfanimationsTypen.Keine.ToString.ToLower
                DataSettings.KampfAnimationen = KampfanimationsTypen.Keine
                DataSettings.MySettingsIniSave()
                Spielmodus = Spielmodi.Nichts
            Case "strategie"
                Spielmodus = Spielmodi.Nichts
                For I = 0 To Objektverwalter.Spielfeld.Regeln.SitutionsSitzung.Count - 1
                    If Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).KOID.ToLower = "spieler".ToLower Then 'Der Aktuelle erste KO des Spielers soll sprechen.
                        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Spieler).KOS(0).KOID, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Text, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Spieler, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Gesichtsausdruck, , Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Musik, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiss hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
                    Else 'Ein vordefinierter KO soll sprechen.
                        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).KOID, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Text, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Spieler, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Gesichtsausdruck, , Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Musik, Objektverwalter.Spielfeld.Regeln.SitutionsSitzung(I).Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiss hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
                    End If
                Next
            Case "siegbedingung"
                Spielmodus = Spielmodi.Nichts
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText("NELL", Objektverwalter.Spielfeld.Regeln.Siegbedingung, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Normal)})
            Case "heilen"
                Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "kugel feuern"
                Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "laser"
                Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "schuss"
                Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.FeuerSchussMarkieren()
                If Objektverwalter.MarkierteFelder.Count = 0 Then
                    Spielmodus = Spielmodi.Nichts
                Else
                    Spielmodus = Spielmodi.GebaeudeSchuss
                    Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
                End If
            Case "aruurafeuer"
                Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "schocklaser"
                Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "reparieren"
                Objektverwalter.ReparierenAnzeigen()
            Case "warten"
                Objektverwalter.Warten()
            Case "ko einheit"
                Objektverwalter.CreateKOEinheit()
            Case "fracht"
                Objektverwalter.Fracht()
            Case "einen"
                Objektverwalter.Einen()
            Case "feuer"
                Objektverwalter.Angriffanzeigen()
            Case "feuerrakete"
                Objektverwalter.LeuchtraketenZieleAbfeuern()
            Case "besetzen"
                Objektverwalter.Besetzen()
            Case "basis bauen"
                Objektverwalter.BuildTempBase()
            Case "tarnen"
                Objektverwalter.Tarnen()
            Case "auftauchen"
                Objektverwalter.Auftauchen()
            Case "ration"
                Objektverwalter.Ration(False, 4, Objektverwalter.Spielfeld.MomentaneSchlacht)
            Case "zuenden"
                Spielmodus = Spielmodi.SiloAbfeuern
                Hauptmenue.CursorPlazieren(Objektverwalter.EinheitenMenue.Feldpunkt.X * Hauptmenue.Feldbreite, Objektverwalter.EinheitenMenue.Feldpunkt.Y * Hauptmenue.Feldbreite)
                Objektverwalter.EinheitenMenue.Dispose()
                Objektverwalter.EinheitenMenue = Nothing
            Case "explosion"
                Spielmodus = Spielmodi.Explosion
            Case "bauen"
                'Wir wollen mit einer Einheit ein Gebaeude bauen
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Objektverwalter.GebaeudeBauMenuerschaffen(Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y)
                Else
                    Objektverwalter.GebaeudeBauMenuerschaffen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                End If
                Auswahlmenueloeschen = False
            Case "truppenbau"
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Objektverwalter.CreateBauMenue(Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y)
                Else
                    Objektverwalter.CreateBauMenue(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                End If
                Spielmodus = Spielmodi.FlugzeugTraegerBauen
                Auswahlmenueloeschen = False
            Case "gabe"
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabe()
            Case "spezialgabe"
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Spezialgabe()
            Case "doppelgabe"
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Doppelgabe()
            Case "musik"
                DataSettings.MusikSound = Not DataSettings.MusikSound
                DataSettings.MySettingsIniSave()
                Spielmodus = Spielmodi.Nichts
            Case "kampfanimationen"
                Objektverwalter.AuswahlAnimationsMenuerschaffen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Auswahlmenueloeschen = False
            Case "abzug"
                Spielmodus = Spielmodi.Abzug
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "naechster spieler"

                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                    Dim Befehl As New KINetzwerkBefehl
                    Befehl.Befehl = ObjektKI.KIModiExtern.RundenEnde
                    Befehl.KooX = -1
                    Befehl.KooY = -1
                    Befehl.WegX = New Integer() {-1}
                    Befehl.WegY = New Integer() {-1}
                    Befehl.OpferX = -1
                    Befehl.OpferY = -1
                    Befehl.AngreiferSchaden = -1
                    Befehl.Verteidigerschaden = -1
                    Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                    Hauptmenue.NetzBefehlSenden(Befehl)
                End If

                Objektverwalter.Spielfeld.RundenEnde()
                Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Case "wechsel"
                Spielmodus = Spielmodi.Nichts
                Objektverwalter.Spielfeld.AktuellerSpieler.Wechsel()
            Case "beenden"
                Dispose()
                Exit Sub
            Case "speichern"
                Hauptmenue.SpielstandSpeichern()
                Spielmodus = Spielmodi.Nichts
            Case "ko"
                Spielmodus = Spielmodi.KOInfoAnzeige
                Objektverwalter.Spielfeld.KOInfos = New ObjektKOInformation(DataSettings.BildschirmBreite / 2 - ObjektKOInformation.Bildbreite / 2, DataSettings.BildschirmHoehe / 2 - ObjektKOInformation.Bildhoehe / 2, New PointF(0.5#, 0.5#))
            Case "tor 1"
                Spielmodus = Spielmodi.Tor1Bauen
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Auswahlmenueloeschen = False
            Case "tor 2"
                Spielmodus = Spielmodi.Tor2Bauen
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Auswahlmenueloeschen = False
            Case "tor 3"
                Spielmodus = Spielmodi.Tor3Bauen
                Objektverwalter.Gebaeudeauswaehlen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y)
                Auswahlmenueloeschen = False
                'Die nachfolgenden 6 Befehle gehoeren zur Omega-Rakete und deren Bau
            Case "raketenantrieb"
                Dim O As GebaeudeOmega_Rakete = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                O.ErweiterungKaufen("Raketenantrieb")
            Case "raketenrumpf"
                Dim O As GebaeudeOmega_Rakete = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                O.ErweiterungKaufen("Raketenrumpf")
            Case "sprengstoffkapsel"
                Dim O As GebaeudeOmega_Rakete = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                O.ErweiterungKaufen("Sprengstoffkapsel")
            Case "sprengstoff"
                Dim O As GebaeudeOmega_Rakete = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                O.ErweiterungKaufen("Sprengstoff")
            Case "zielsuchsystem"
                Dim O As GebaeudeOmega_Rakete = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                O.ErweiterungKaufen("Zielsuchsystem")
            Case "omega-rakete zuenden"
                'Haehae! Jetzt macht es gleich Boooom und zwar richtig.=D
                Spielmodus = Spielmodi.OmegaRaketeZuenden
            Case "schlacht wechsel"
                Objektverwalter.Spielfeld.SchlachtWechseln()
                Spielmodus = Spielmodi.Nichts
            Case "einheit schicken"
                Objektverwalter.Schicken()
            Case Else
                If IsNothing(Objektverwalter.Spielfeld.AktuelleEinheit) Then
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                        If Spielmodus = Spielmodi.Tor1Bauen Or Spielmodus = Spielmodi.Tor2Bauen Or Spielmodus = Spielmodi.Tor3Bauen Then
                            'Die Fabrik braucht keine Zielkoordinaten
                            Dim F As GebaeudeFabrik = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude
                            Select Case Spielmodus
                                Case Spielmodi.Tor1Bauen
                                    F.Variablen(0).Wert = F.Variablen(0).Wert - 1
                                    F.Bauen(Objektverwalter.EinheitenMenue.Tags(Objektverwalter.EinheitenMenue.GetCursorPosition), F.Rechteck.X - 1, F.Rechteck.Y + 2)
                                Case Spielmodi.Tor2Bauen
                                    F.Variablen(0).Wert = F.Variablen(0).Wert - 2
                                    F.Bauen(Objektverwalter.EinheitenMenue.Tags(Objektverwalter.EinheitenMenue.GetCursorPosition), F.Rechteck.X, F.Rechteck.Y + 2)
                                Case Spielmodi.Tor3Bauen
                                    F.Variablen(0).Wert = F.Variablen(0).Wert - 4
                                    F.Bauen(Objektverwalter.EinheitenMenue.Tags(Objektverwalter.EinheitenMenue.GetCursorPosition), F.Rechteck.X + 1, F.Rechteck.Y + 2)
                            End Select
                        Else
                            If Objektverwalter.EinheitenMenue.Enabled(Objektverwalter.EinheitenMenue.GetCursorPosition) = False Then
                                'Wir koennen diese Einheit bauen
                                'Bevor wir sie Bauen muessen wir noch schnell Autospeichern, damit man diese  Einheit bauen zurueckmachen kann.
                                Objektverwalter.Autospeichern()
                                Dim Ziehen As Boolean = False
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOBoostApply(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y) Then
                                    Ziehen = Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).NachBauZiehen
                                End If
                                Objektverwalter.EinheitBauen(Objektverwalter.EinheitenMenue.Tags(Objektverwalter.EinheitenMenue.GetCursorPosition).Split(" "), Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Not Ziehen, False)
                            Else
                                'Wir koennen sie nicht bauen
                                Exit Sub
                            End If
                            Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
                        End If
                    End If
                ElseIf Spielmodus = Spielmodi.FlugzeugTraegerBauen Then
                    If Objektverwalter.EinheitenMenue.Enabled(Objektverwalter.EinheitenMenue.GetCursorPosition) = False Then
                        'Wir koennen diese Einheit bauen
                        'Bevor wir sie Bauen muessen wir noch schnell Autospeichern, damit man diese  Einheit bauen zurueckmachen kann.
                        Objektverwalter.Autospeichern()
                        Dim Ziehen As Boolean = False
                        If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOBoostApply(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y) Then
                            Ziehen = Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).NachBauZiehen
                        End If

                        Objektverwalter.EinheitBauenFlugzeugtraeger(Objektverwalter.EinheitenMenue.Tags(Objektverwalter.EinheitenMenue.GetCursorPosition).Split(" "), Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Not Ziehen, False)
                    Else
                        'Wir koennen sie nicht bauen
                        Exit Sub
                    End If
                ElseIf Objektverwalter.Spielfeld.AktuelleEinheit.Faehigkeit.Split("+").Contains("Bauen") Then
                    'Wir wollen ein Gebaeude bauen.
                    If Objektverwalter.EinheitenMenue.Enabled(Objektverwalter.EinheitenMenue.GetCursorPosition) = False Then
                        Dim ID As String = GetGebaeudeID(Objektverwalter.EinheitenMenue.Tags(Objektverwalter.EinheitenMenue.GetCursorPosition))
                        'Wir koennen das Gebaeude bauen.
                        If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            Objektverwalter.GebaeudeBauen(Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y, ID)
                        Else
                            Objektverwalter.GebaeudeBauen(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, ID)
                        End If
                    Else
                        Exit Sub
                    End If
                ElseIf Objektverwalter.Spielfeld.AktuelleEinheit.Ladung.Length > 0 Then
                    If IsNothing(Objektverwalter.Spielfeld.AktuelleEinheit.Ladung(0)) = False Then
                        'Wir haben eine Einheit die eine andere ausladen will
                        Spielmodus = Spielmodi.Entladen
                        Dim Einheit As Integer = -1
                        For I = 0 To Objektverwalter.EinheitenMenue.Tags.Length - 1
                            If Objektverwalter.EinheitenTextur.GetUnitID(ObjektLadeklasse.GetIDFromName(Objektverwalter.EinheitenMenue.Tags(I))) >= 0 Then
                                Einheit += 1
                            End If
                            If I = Objektverwalter.EinheitenMenue.GetCursorPosition Then
                                ZuentladendeEinheit = Einheit
                                Exit For
                            End If
                        Next
                        Objektverwalter.EntladungAnzeigen(ZuentladendeEinheit)
                    End If
                End If
        End Select

        'Wir machen das Auswahlmenue weg
        If Auswahlmenueloeschen = True Then
            If Objektverwalter.EinheitenMenue IsNot Nothing Then
                If Spielmodus = Spielmodi.Nichts Then
                    Objektverwalter.EinheitenMenue.Dispose()
                    Hauptmenue.CursorPlazieren(Objektverwalter.EinheitenMenue.Feldpunkt.X * Hauptmenue.Feldbreite, Objektverwalter.EinheitenMenue.Feldpunkt.Y * Hauptmenue.Feldbreite)
                End If
                Objektverwalter.EinheitenMenue = Nothing
            End If
            ObjektMaus.Visible = True
        End If
        If DataSettings.AutoEndTurn Then
            Objektverwalter.Spielfeld.AutoEndTurn()
        End If
    End Sub


    ''' <summary>
    ''' Holt aus dem String des Gebaeudebaumenues die GebaeudeID heraus
    ''' </summary>
    ''' <remarks></remarks>
    Private Function GetGebaeudeID(ByVal Text As String) As String
        Text = Text.Remove(Text.LastIndexOf(" "))
        Select Case Text
            Case "Mauer_bauen"
                Return "MAUER"
            Case "Bruecke_bauen"
                Return "BRUECKE"
            Case "Rakete_bauen"
                Return "SILO"
            Case "Minigeschuetz_Nord_bauen"
                Return "MINIGESCHUETZ+N"
            Case "Minigeschuetz_Ost_bauen"
                Return "MINIGESCHUETZ+O"
            Case "Minigeschuetz_Sued_bauen"
                Return "MINIGESCHUETZ+S"
            Case "Minigeschuetz_West_bauen"
                Return "MINIGESCHUETZ+W"
            Case "Laser_bauen"
                Return "LASER"
            Case "Kristall_bauen"
                Return "KRISTALL"
            Case "Schwarze_Geschuetz_Nord_bauen"
                Return "SCHWARZE GESCHUETZ+N"
            Case "Schwarze_Geschuetz_Sued_bauen"
                Return "SCHWARZE_GESCHUETZ+S"
            Case "Schwarze_Geschuetz_West_bauen"
                Return "SCHWARZE GESCHUETZ+W"
            Case "Schwarze_Geschuetz_Ost_bauen"
                Return "SCHWARZE GESCHUETZ+O"
            Case "Schocklaser_Nord_bauen"
                Return "SCHOCKLASER+N"
            Case "Schocklaser_Sued_bauen"
                Return "SCHOCKLASER+S"
            Case "Schocklaser_West_bauen"
                Return "SCHOCKLASER+W"
            Case "Schocklaser_Ost_bauen"
                Return "SCHOCKLASER+O"
            Case "Monolith_bauen"
                Return "MONOLITH"
            Case "Omega-Rakete_bauen"
                Return "OMEGARAKETE"
            Case "Festung_bauen"
                Return "FESTUNG"
            Case "Fliegendes_Minigeschuetz_Nord_bauen"
                Return "FLIEGENDESMINIGESCHUETZ+N"
            Case "Fliegendes_Minigeschuetz_Ost_bauen"
                Return "FLIEGENDESMINIGESCHUETZ+O"
            Case "Fliegendes_Minigeschuetz_Sued_bauen"
                Return "FLIEGENDESMINIGESCHUETZ+S"
            Case "Fliegendes_Minigeschuetz_West_bauen"
                Return "FLIEGENDESMINIGESCHUETZ+W"
            Case "Fliegende_Festung_bauen"
                Return "FLIEGENDEFESTUNG"
            Case Else
                Return ""
        End Select
    End Function
    ''' <summary>
    ''' Zeigt den Feuerradius einer Einheit an
    ''' </summary>
    ''' <param name="X">ihre X Koordinate im Array</param>
    ''' <param name="Y">ihre Y Koordinate im Array</param>
    ''' <remarks></remarks>
    Public Sub FeuerradiusAnzeigen(ByVal X As Integer, ByVal Y As Integer)
        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
        If E.Waffe1 <> "Keine" Or E.Waffe2 <> "Keine" Then
            Spielmodus = Spielmodi.FeuerradiusAnzeigen
            'Wir zeigen den Nahkampf an
            'Wir haben eine Nahkampfeinheit
            Dim WSS As Wegsuchsystem
            Dim Bewegunspunkte As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).GetMovementRange
            If Bewegunspunkte <= Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff Then
                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
            ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff = -1 Then
                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
            Else
                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff)
            End If
            Dim MaximaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MaximaleReichweite
            Dim MinimaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MinimaleReichweite
            Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)

            For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                    Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                    If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                        If Kosten = 0 Then
                            For X2 = 0 To MaximaleReichweite * 2
                                For Y2 = 0 To MaximaleReichweite * 2
                                    If Kreis(X2, Y2) >= MinimaleReichweite Then
                                        Objektverwalter.neuMarkiertesFeld(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2, Color.FromArgb(150, 255, 255, 255), "Rot")
                                    End If
                                Next
                            Next
                            If E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                Objektverwalter.neuMarkiertesFeld(X1, Y1, Color.FromArgb(150, 255, 255, 255), "Rot")
                            End If
                        Else
                            If E.CanIndirectMoveAndFire Then
                                For X2 = 0 To MaximaleReichweite * 2
                                    For Y2 = 0 To MaximaleReichweite * 2
                                        If Kreis(X2, Y2) >= MinimaleReichweite Then
                                            Objektverwalter.neuMarkiertesFeld(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2, Color.FromArgb(150, 255, 255, 255), "Rot")
                                        End If
                                    Next
                                Next
                            ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                Objektverwalter.neuMarkiertesFeld(X1, Y1, Color.FromArgb(150, 255, 255, 255), "Rot")
                            End If
                        End If
                    ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                        Dim X2 As Integer = X1
                        Dim Y2 As Integer = Y1
                        For I = 0 To 3
                            Select Case I
                                Case 0
                                    X2 -= 1
                                Case 1
                                    X2 += 1
                                    Y2 -= 1
                                Case 2
                                    X2 += 1
                                    Y2 += 1
                                Case 3
                                    X2 -= 1
                                    Y2 += 1
                            End Select
                            If Objektverwalter.Spielfeld.OnMap(X2, Y2) Then
                                Kosten = WSS.getBewegungspunktekosten(X2, Y2)
                                If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                    Objektverwalter.neuMarkiertesFeld(X1, Y1, Color.FromArgb(150, 255, 255, 255), "Rot")
                                    Exit For
                                End If
                            End If
                        Next
                    End If
                Next
            Next
            MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Einheitausgewaehlt.wav", False)
        End If
    End Sub
    Public Sub CursorVerschieben(ByVal XVeraenderung As Integer, ByVal YVeraenderung As Integer)
        MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
        Select Case Spielmodus
            Case Spielmodi.AuswahlmenueEinheit
                If IsNothing(Objektverwalter.EinheitenMenue) = False Then
                    If YVeraenderung > 0 Then
                        Objektverwalter.EinheitenMenue.CursorpositionVeraendern(1, 0)
                    ElseIf YVeraenderung < 0 Then
                        Objektverwalter.EinheitenMenue.CursorpositionVeraendern(-1, 0)
                    End If
                    If XVeraenderung > 0 Then
                        Objektverwalter.EinheitenMenue.CursorpositionVeraendern(0, 1)
                    ElseIf XVeraenderung < 0 Then
                        Objektverwalter.EinheitenMenue.CursorpositionVeraendern(0, -1)
                    End If
                End If
            Case Spielmodi.Gebaeudeausgewaehlt
            Case Else
                If DataSettings.draw3D Or DataSettings._2D_3D_Malen Then
                    If (Hauptmenue.SpielfeldPunkt.X < 0 Or Hauptmenue.SpielfeldPunkt.Y < 0) Then
                        Hauptmenue.MoveCursorByKeyOutsideMap(XVeraenderung, YVeraenderung)
                    Else
                        Hauptmenue.CursorPlazieren((Hauptmenue.SpielfeldPunkt.X + XVeraenderung) * Hauptmenue.Feldbreite, (Hauptmenue.SpielfeldPunkt.Y + YVeraenderung) * Hauptmenue.Feldbreite)
                    End If
                Else
                    Dim X As Integer = Hauptmenue.SpielfeldPunkt.X + XVeraenderung
                    Dim Y As Integer = Hauptmenue.SpielfeldPunkt.Y + YVeraenderung
                    X = X * Hauptmenue.Feldbreite : Y = Y * Hauptmenue.Feldbreite
                    Hauptmenue.CursorPlazieren(X, Y)
                    RandVerschieben()
                End If
        End Select
    End Sub
    Public Shared Sub RandVerschieben()

    End Sub
    ''' <summary>
    ''' Gibt der ausgewaehlte Einheit den Befehl auf das ausgewaehlte Feld zuziehen
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Sub EinheitBewegungsBefehl(ByVal X As Integer, ByVal Y As Integer)
        'Die Einheit gehoert uns
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            If Objektverwalter.Spielfeld.AktuelleEinheit.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    'Die Koordinaten sind manchmal nicht exakt mit der Cursor Position! Liegt wahrscheinlich an der Synchro
                    X = Hauptmenue.SpielfeldPunkt.X
                    Y = Hauptmenue.SpielfeldPunkt.Y
                End If
                If Objektverwalter.Spielfeld.AktuelleEinheitPosition.X = X And Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y = Y Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        'Die Einheit bleibt auf diesem Feld
                        Objektverwalter.Befehlsmenuerschaffen()
                    Else
                        'Eigentlich kann und darf das nicht passieren, aber es passiert!
                        Objektverwalter.Spielfeld.Laufen = Nothing
                        'Objektverwalter.Spielfeld.CurrentAI.KISchleifeZiehen()
                    End If
                Else
                    'Es ist ein anderes Feld
                    'Dann wird sie zu diesem Feld hin bewegt
                    If IsNothing(Objektverwalter.Spielfeld.Laufen) = True Then
                        MoveUnit(X, Y)
                    ElseIf Not Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                        Objektverwalter.Spielfeld.LaufenLoeschen = False
                        MoveUnit(X, Y)
                    End If
                End If
            End If
        End If
    End Sub
    Private Sub MoveUnit(ByVal X As Integer, ByVal Y As Integer)
        If Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX.Length > 0 Then
            If DataSettings.KonsolenSpielBefehle Then
                Konsole.Write("Move Unit at X=" + Objektverwalter.Spielfeld.AktuelleEinheitPosition.X.ToString + ", Y=" + Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y.ToString + " to X=" + X.ToString + ", Y=" + Y.ToString)
            End If
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = True Then
                'Wir koennen sogar hin Laufen na dann auf
                Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                Objektverwalter.Spielfeld.Laufen = New ObjektLaufen(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, New Point(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y))
            Else
                If Objektverwalter.Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Hoellium.ToString Then
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) Then
                        Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                        Objektverwalter.Spielfeld.Laufen = New ObjektLaufen(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, New Point(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y))
                    ElseIf Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).Team Then
                        Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                        Objektverwalter.Spielfeld.Laufen = New ObjektLaufen(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, New Point(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y))
                    End If
                ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).EinheitenID = Objektverwalter.Spielfeld.AktuelleEinheit.EinheitenID And Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getKP <= 9 Then
                    'Wir koennen sogar hin Laufen na dann auf und dann Einen
                    Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                    Objektverwalter.Spielfeld.Laufen = New ObjektLaufen(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, New Point(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y))
                ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).IsLoadable(Objektverwalter.Spielfeld.AktuelleEinheit) Then
                    Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                    Objektverwalter.Spielfeld.Laufen = New ObjektLaufen(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, New Point(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y))
                ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = False Then
                    Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                    Objektverwalter.Spielfeld.Laufen = New ObjektLaufen(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, New Point(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y))
                ElseIf IsNothing(Objektverwalter.Spielfeld.CurrentAI) Then

                End If
            End If
        End If
    End Sub
    Public Sub SPSchadenAnzeigen()
        If Hauptmenue.Formmodus = Hauptmenue.Formmodi.Spiel Then
            If Objektverwalter.Spielfeld.OnMap(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                Dim Neu As Boolean = False
                If IsNothing(Objektverwalter.Spielfeld.AngriffsAnzeige) = False Then
                    If Not Hauptmenue.SpielfeldPunkt.X = (Objektverwalter.Spielfeld.AngriffsAnzeige.Koordinaten.X - Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenue.Feldbreite) / Hauptmenue.Feldbreite Then
                        Neu = True
                    ElseIf Not Hauptmenue.SpielfeldPunkt.Y = (Objektverwalter.Spielfeld.AngriffsAnzeige.Koordinaten.Y + 24 + Hauptmenue.Feldbreite - Objektverwalter.Spielfeld.BildschirmKooY) / Hauptmenue.Feldbreite Then
                        Neu = True
                    End If
                Else
                    Neu = True
                End If
                If Spielmodus = Spielmodi.Angriff Then
                    If Objektverwalter.ExistiertMarkiertesFeldschon(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                        If Neu = True Then
                            Dim S As ObjektSpieler = Objektverwalter.Spielfeld.AktuelleEinheit.GetSpieler
                            If S.KOS(0).SpriteVertauschung = True And S.Team <> Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Regeln.LetzterMensch).Team Then
                                Dim Schaden() As String = {Zufallszahl(0, 100).ToString}
                                Dim X As Integer = 2
                                If Schaden(0).Count = 2 Then
                                    X += 6
                                ElseIf Schaden(0).Count = 1 Then
                                    X += 12
                                End If
                                Objektverwalter.Spielfeld.AngriffsAnzeige = New ObjektLabel(Hauptmenue.SpielfeldPunkt.X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX - Hauptmenue.Feldbreite, Hauptmenue.SpielfeldPunkt.Y * Hauptmenue.Feldbreite - 24 - Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, DataSettings.Resourcenpfad + "Objects\SchadenLabel.png", Schaden, New Point(X, 8), 10, 7, New PointF, , True)
                            Else
                                Dim Fernkampf As Boolean = False
                                Dim X1, Y1 As Integer
                                If IsNothing(Objektverwalter.Spielfeld.Laufen) Then
                                    X1 = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X : Y1 = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                                    If Math.Abs(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X - Hauptmenue.SpielfeldPunkt.X) + Math.Abs(Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y - Hauptmenue.SpielfeldPunkt.Y) > 1 Then
                                        Fernkampf = True
                                    End If
                                Else
                                    X1 = Objektverwalter.Spielfeld.Laufen.Position.X : Y1 = Objektverwalter.Spielfeld.Laufen.Position.Y
                                    If Math.Abs(Objektverwalter.Spielfeld.Laufen.Position.X - Hauptmenue.SpielfeldPunkt.X) + Math.Abs(Objektverwalter.Spielfeld.Laufen.Position.Y - Hauptmenue.SpielfeldPunkt.Y) > 1 Then
                                        Fernkampf = True
                                    End If
                                End If
                                Dim AngreiferLeben As Integer = Objektverwalter.Spielfeld.AktuelleEinheit.Leben
                                Dim VerteidigerLeben As Integer = 0
                                If IsNothing(Objektverwalter.Spielfeld.Einheiten(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                    VerteidigerLeben = Objektverwalter.Spielfeld.Einheiten(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben
                                ElseIf Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben > 0 Then
                                    VerteidigerLeben = Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben
                                ElseIf IsNothing(Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                                    VerteidigerLeben = Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.KP
                                End If
                                Dim Schaden() As String = {CInt(Objektverwalter.Schadensberechnung(Objektverwalter.Spielfeld.AktuelleEinheit, X1, Y1, Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, AngreiferLeben, VerteidigerLeben, False, False, -999, Nothing, False)(0))}
                                If Objektverwalter.Spielfeld.Regeln.NoLuck Then
                                    Schaden(0) = (CInt(Schaden(0)) + Objektverwalter.Spielfeld.AktuelleEinheit.GetSpieler.GetGlueckPech(Objektverwalter.Spielfeld.AktuelleEinheit.X, Objektverwalter.Spielfeld.AktuelleEinheit.Y).X).ToString
                                End If
                                Dim X As Integer = 2
                                If Schaden(0).Count = 2 Then
                                    X += 6
                                ElseIf Schaden(0).Count = 1 Then
                                    X += 12
                                End If

                                Objektverwalter.Spielfeld.AngriffsAnzeige = New ObjektLabel(Hauptmenue.SpielfeldPunkt.X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX - Hauptmenue.Feldbreite, Hauptmenue.SpielfeldPunkt.Y * Hauptmenue.Feldbreite - 24 - Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, DataSettings.Resourcenpfad + "Objects\SchadenLabel.png", Schaden, New Point(X, 8), 10, 7, New PointF, , True)
                            End If
                            MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Ziel.wav", False)
                        End If
                    Else
                        Objektverwalter.Spielfeld.AngriffsAnzeige = Nothing
                    End If
                ElseIf Spielmodus = Spielmodi.GebaeudeSchuss Then
                    If Objektverwalter.ExistiertMarkiertesFeldschon(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                        If Neu = True Then
                            Dim Schaden() As String = {Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Schaden * 10}
                            Dim X As Integer = 2
                            If Schaden(0).Count = 2 Then
                                X += 6
                            ElseIf Schaden(0).Count = 1 Then
                                X += 12
                            End If
                            Objektverwalter.Spielfeld.AngriffsAnzeige = New ObjektLabel(Hauptmenue.SpielfeldPunkt.X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX - Hauptmenue.Feldbreite, Hauptmenue.SpielfeldPunkt.Y * Hauptmenue.Feldbreite - 24 - Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, DataSettings.Resourcenpfad + "Objects\SchadenLabel.png", Schaden, New Point(X, 8), 10, 7, New PointF(0, 0), , True)
                            MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Ziel.wav", False)
                        End If
                    Else
                        Objektverwalter.Spielfeld.AngriffsAnzeige = Nothing
                    End If
                Else
                    Objektverwalter.Spielfeld.AngriffsAnzeige = Nothing
                End If
            End If
        End If
    End Sub

    Public Overrides Sub IniMenue()

    End Sub

    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)
        If Objektverwalter.Spielfeld.EingabenErlauben = True Then
            Select Case Eingabe.ToLower
                Case "beenden"
                    SPStringBefehl(Eingabe)
                Case "naechster Spieler".ToLower
                    SPStringBefehl(Eingabe)
                Case "Speichern".ToLower
                    SPStringBefehl(Eingabe)
                Case "Kao Wechsel".ToLower
                    If Not Objektverwalter.Spielfeld.AktuellerSpieler.KOS(1) Is Nothing Then
                        SPStringBefehl("wechsel")
                    End If
                Case "naechste Einheit".ToLower
                    Objektverwalter.Spielfeld.NaechsteEinheit()
                Case "schnellspeichern"
                    Hauptmenue.Speichern("Schnellspeichern", ".sav")
                Case "schnellladen"
                    If Objektverwalter.Spielfeld.EingabenErlauben Then 'Ich habe schlechte Erfahrungen gemacht, wenn man speichert, wenn die KI am Zug ist. Die wird naemlich nicht mitgeladen und schon kann man ewig darauf warten, dass der andere Spieler macht.
                        Objektverwalter.Autospeichern() 'Ich trau der Spracherkennung noch nicht so ganz ueber den Weg, obwohl ich sie selbst eingebaut habe, (Vielleicht auch gerade deswegen)(Von Spracherkennung selbst hab ich natuerlich keine Ahnung aber ich habe heldenhaft die 3 Verweise gesetzt :)
                        'notfalls kann man ja mit Strg+Z wieder den Aktuellen stand laden
                        Hauptmenue.Laden("Schnellspeichern", False, ".sav", , , True)
                    End If
            End Select
        End If
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
        If Chat IsNot Nothing Then
            Chat.ChangeWindowSize(PosChange)
        End If
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.KOInfos IsNot Nothing Then
                Objektverwalter.Spielfeld.KOInfos.ChangeWindowSize(PosChange)
            End If
        End If
        '...
    End Sub


    Public Sub Dispose()

        If RecordInfoAnzeige IsNot Nothing Then RecordInfoAnzeige.Dispose()
        If DataSettings.AutoresizeWindow And DataSettings.Fenstermodus And Not (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
            Hauptmenue.MainMenue.Size = OldSize
            DataSettings.BildschirmBreite = Hauptmenue.MainMenue.Width - Hauptmenue.Rand.X * 2
            DataSettings.BildschirmHoehe = Hauptmenue.MainMenue.Height - (Hauptmenue.Rand.Y + Hauptmenue.Rand.X)
            DataSettings.MySettingsIniSave()
        End If

        ObjektScript.Reset()
        Objektverwalter.Spielfeld.KOAnzeigen.Reset()
        If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
            If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            End If
        End If
        If Objektverwalter.Spielfeld.Regeln.Spielende Then 'Game Over?
            If Hauptmenue.AufzeichnungAktiv Then 'Making a Record?
                If MessageBox.ShowMessageBox("Willst du die Aufzeichnung dieses Spiels speichern?", MsgBoxStyle.YesNo, "Aufzeichnung") = MsgBoxResult.No Then
                    Hauptmenue.AufzeichnungAbbrechen() 'We don't won't to save it ->Delete it.
                End If
            End If
        End If
        Hauptmenue.Speichern("Spiel", ".sav")
        Hauptmenue.Ini(Hauptmenue.Formmodi.SiegMenue)
    End Sub

    Public Sub AutoResizeWindow()
        If DataSettings.AutoresizeWindow And DataSettings.Fenstermodus And Not (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
            OldSize = Hauptmenue.MainMenue.Size
            Dim MinKartengroesse As Integer = 15
            If Not Objektverwalter.Spielfeld Is Nothing Then
                Dim B As Integer = Objektverwalter.Spielfeld.Breite
                Dim H As Integer = Objektverwalter.Spielfeld.Hoehe
                If B >= MinKartengroesse Then
                    Hauptmenue.MainMenue.Width = Hauptmenue.Feldbreite * B + Hauptmenue.Rand.X * 2
                Else
                    Hauptmenue.MainMenue.Width = MinKartengroesse * Hauptmenue.Feldbreite + Hauptmenue.Rand.X * 2
                End If
                If H >= MinKartengroesse Then
                    Hauptmenue.MainMenue.Height = Hauptmenue.Feldbreite * H + Hauptmenue.Rand.Y + Hauptmenue.Rand.X
                Else
                    Hauptmenue.MainMenue.Height = MinKartengroesse * Hauptmenue.Feldbreite + Hauptmenue.Rand.Y + Hauptmenue.Rand.X
                End If
            End If
            DataSettings.BildschirmBreite = Hauptmenue.MainMenue.Width - Hauptmenue.Rand.X * 2
            DataSettings.BildschirmHoehe = Hauptmenue.MainMenue.Height - (Hauptmenue.Rand.Y + Hauptmenue.Rand.X)
            DataSettings.MySettingsIniSave()
        Else
            OldSize = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
        End If
    End Sub

#Region "Tooltip"
    ''' <summary>
    ''' Shows the current Tooltip
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides Sub ShowToolTip()
        If MyBase.ToolTipCounterFrame Then
            If Objektverwalter.ToolTips Is Nothing Then
                If Objektverwalter.Spielfeld.OnMap(Hauptmenue.SpielfeldPunkt) Then
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    If E Is Nothing Then
                        Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                        If L.Gebaeude Is Nothing Then
                            Objektverwalter.ToolTips = New ToolTip(Sprachconverter.Translate(L.Landschaftsname), Sprachconverter.GetToolTip(L.LandschaftsID), ObjektMaus.GetCursorPosition)
                        Else
                            Objektverwalter.ToolTips = New ToolTip(Sprachconverter.Translate(L.Gebaeude.Gebaeudename), Sprachconverter.GetToolTip(L.Gebaeude.GebaeudeID), ObjektMaus.GetCursorPosition)
                        End If
                    Else
                        Objektverwalter.ToolTips = New ToolTip(Sprachconverter.Translate(E.Einheitenname), Sprachconverter.GetToolTip(E.EinheitenID), ObjektMaus.GetCursorPosition)
                    End If
                End If
            End If
        Else
            Objektverwalter.ToolTips = Nothing
        End If
    End Sub
    Public Overrides Function DidCursorMove() As Boolean
        If Objektverwalter.Spielfeld.Laufen Is Nothing Then
            If Objektverwalter.Spielfeld.KOInfos Is Nothing Then
                If Objektverwalter.Spielfeld.Angriff Is Nothing Then
                    If Objektverwalter.Spielfeld.Animationen.Length = 0 Then
                        If BackbufferSpiel.GetBufferLength = 0 Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                If MessageBox.MessageDialogueBox Is Nothing Then
                                    If Objektverwalter.EinheitenMenue Is Nothing Then
                                        Return MyBase.DidCursorMove
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If
        ToolTipCounter = 0
        Return False
    End Function
#End Region

    Public Overrides Sub KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case DataSettings.Key_Scrollen
                Hauptmenue.Scrollen = False
                Hauptmenue.ScrollenKameraKippen = False
        End Select
    End Sub
End Class
